#/*************************************************************************
#    > File Name: Lib/Content_Operation.py
#    > Author: Yan Wang
#    > Mail: wangyan@imnu.edu.cn
#    > Created Time: 2022年06月22日 星期三 12时25分47秒
# ************************************************************************/
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 打开源文件 param_card.dat， 找出要替换的行的行数。
# 输出为 word_list 为需要被替换的行的内容， 用于检查是否选择正确
# input_line_list 为需要被替换的行的行数， 后面用于调用
from Library import * 
from File_Operation import * 
def Find_Line(file_name, labels={}):
    input_line_list = []
    word_list = []
    with open(file_name, 'r') as (f):   #“r”只读模式打开文件
        list1 = f.readlines()   #readlines()读取所有行并返回列表
        for i in range(0, len(list1)):
            list1[i] = list1[i].rstrip('\n')    #.rstrip()删除指定字符串---删除空行
            for key in labels:
                if list1[i].count(key) >= 1:   #count() 方法用于统计字符串里某个字符或子字符串出现的次数
                    if labels[key] == 0:
                        input_line_list.append(i + 1)   #append()在末尾添加()内新对象
                        word_list.append(list1[i])
                    else:
                        for j in range(labels[key]):
                            input_line_list.append(i + 2 + j)
                            word_list.append(list1[(i + j + 1)])
    return(word_list, input_line_list)

# 利用Find_Line, 给定一个字符串，从一个文件夹中的所有文件内，寻找包含此字符串的句子，并输出该句。
# 默认忽略数据文件
def Extract_One_Sentence_From_MultiFile(target_folder_name, label, line_num=0,ignored=[".lhe",".root",".gz",".hepmc",".tar",".deb", ".log",".sh", ".pdf", ".dat", ".cmd"]):
    word_list = []
    file_list = []
    delphes_list = []
    labels = {label: line_num}
    for this_file in Path(target_folder_name).iterdir():   #iterdir()对path指向一个目录时，列出该路径下所有子路径(排序处理)。
        #file_name = os.path.join(target_folder_name.name ,this_file.name)   #os.path.join()路径拼接target_folder_name.name/this_file.name
        file_kind=this_file.suffix   #suffix 扩展名
        if file_kind == ".root":
            delphes_list.append(this_file)
        if file_kind in ignored:
            continue
        #file_name =os.path.join( target_folder_name, this_file)
        word, input_line_list = Find_Line(this_file, labels)   #Find_Line函数替换
        if word :
            word_list.append(word[0])
            file_list.append(this_file)
    return(file_list, word_list, delphes_list)


# 对一个列表中的多个文件进行替换， 
def Replace_Multi_File(labels, file_list, source, replaced_content):
    word_list, input_line_list = Find_Line(source, labels)   #通过Find_Line替换
    for file_num, files in enumerate(file_list):
        File_Replace(files, input_line_list, replaced_content[file_num])
    return(files)




# 整合多个替换相关函数， 用于给定替换模式下， 生成多个被替换的文件
def File_Replace_with_Para(replaced_param_list, file_source,target_folder, origin_labels):
    num=len(replaced_param_list)
    file_general_name=File_Name_Generalizing(file_source)   #得到file_source_{}
    target_folder=Create_Folder(target_folder,"/")   #创建target_folder的文件夹
    file_source=target_folder / file_source   #得到target_folder/file_source_{}目录
    new_file_name_list=Create_MultiFile(num,file_general_name,target_folder,file_source)   #C_M(A,B,C,D)函数得到C/D(D的基文件)/B_(1-A)---是绝对路径
    word_list,input_line_list=Find_Line(file_source,origin_labels)   #通过Find_Line替换
    for file_num in range(num):
        #print(new_file_name_list[file_num],input_line_list,replaced_param_list[file_num]) 
        File_Replace(new_file_name_list[file_num],input_line_list,replaced_param_list[file_num])   #将new_file_name_list内容的input_line_list行替换为replaced_param_list
    return(new_file_name_list)



def Write_List_by_DF_to_File(input_list, file_name, file_kind=".csv", sep="\t"):
    df=pd.DataFrame(input_list)
    df.to_csv(file_name, sep=sep, index=False)
